﻿#pragma once
// Sprite.h
#ifndef _SPRITE_H_
#define _SPRITE_H_

#include "Animation.h"
#include "camera.h"
#include "vector2.h"
#include "../InputHandler//input.h"

#include <unordered_map>
#include <functional>
#include <string>
#include <graphics.h>
#include <conio.h>
#include <math.h>

class Sprite {
public:
    using StateID = std::string;  // 用户自定义状态标识符
    using Callback = std::function<void()>;
    //三种初始化方式
    Sprite() = default;
    Sprite(const std::string& stateID, Animation anim);
    Sprite(const std::string& stateID,
        LPCTSTR framePathFormat,
        int frameCount,
        int interval = 100,
        bool isLoop = true);

    ~Sprite() = default;

    // 设置初始状态
    bool SetState(const StateID& id, const Vector2& startPos);

    // 添加状态动画，可以直接添加现有动画，也可以给出路径加载资源，动画对象然后存储在map中
    bool AddState(const std::string stateID, Animation anim) { animations[stateID] = std::move(anim); return true; }

    bool AddState(const std::string& stateID,
        LPCTSTR framePathFormat,
        int frameCount,
        int interval = 100,
        bool isLoop = false);

    bool AddFlipAnim(const StateID& id, const StateID& id_flip);

    //状态切换相关函数
    void ChangeState(const StateID& id);

    void SetTransition(const StateID& fromID, const StateID& toID);
    void SetCallback(const StateID& id, Callback callback);

    void Play(const StateID& id, bool loop);
    void Play(const StateID& id, DWORD duration, bool if_interruptible = true);//以毫秒为单位
    bool SwitchSimultaneously(const StateID& target_id);

    void SwitchFacingDuringPlay(bool left);

    // 更新函数，更新Sprite的位置，状态，下一帧的绘制动画
    void Update(int delta);

    // 绘制动画帧
    void Draw(const Camera& cam) const;

    // 位置设置
    void Move(float dx, float dy);
    void SetPos(float x, float y);

    Vector2 position = Vector2(0, 0);    // 位置向量

private:
    StateID currentState;
    std::unordered_map<StateID, Animation> animations;
    std::unordered_map<StateID, StateID> transitions;
    //占据逻辑
    bool caninterupt = true;
    StateID captureState;
    //定时动画逻辑
    bool is_playing_timed_anim = false;
    DWORD AnimStartTime = 0;
    DWORD AnimDuration = 0;
    //Collider collider;
};

#endif // _SPRITE_H_

